<?php
/**
 * Created by PhpStorm.
 * User: s.utkin
 * Date: 15.01.2015
 * Time: 19:14
 */

namespace Menu;


class RenderAction extends \Action {

	protected static $menuConfigClass = '\Menu\MenuItemsConfig';

	protected function run()
	{
		$activePaths = $this->calculateActivePaths($this->request->activePaths);

		$pathDelimiter = $this->request->basePath ? '.' : '';
		$basePath = $this->request->basePath . $pathDelimiter;
		$baseItemPath = $this->request->basePath . $pathDelimiter . 'items';
		$openJustSelected = $this->request->openJustSelected;

		$configItems = \MenuItemsConfig::get($baseItemPath);
		$items = [];

		foreach ($configItems as $itemName => $item) {
			# Исключаем пункты меню, на которые у нас нет прав
			if (isset($item['privileges'])) {
				$accessResponse = $this->action('menu.checkAccess', ['privileges' => $item['privileges']]);

				if (empty((string)$accessResponse)) {
					continue;
				}
			}

			# Исключаем пункты меню, которые отмечены, как неактивные (по умолчанию - true)
			if (isset($item['isActive']) && $item['isActive'] == false) {
				continue;
			}

			# Если указан активный элемент - выключаем активные по умолчанию
			if (isset($item['selected']) && $item['selected'] == true && !empty($activePaths)) {
				$item['selected'] = false;
			}

			# Отмечаем активный элемент
			$itemPath = $baseItemPath . ".$itemName";
			foreach ($activePaths as $activePath) {
				if (strpos($activePath, $itemPath) === 0) {
					$item['selected'] = true;
					break;
				}
			}

			# Рендерим элемент-экшн
			if (isset($item['renderAction'])) {
				$action = $item['renderAction']['name'];
				$params = isset($item['renderAction']['params']) ? $item['renderAction']['params'] : [];
				$params['activePaths'] = $this->request->activePaths;
				$params['selected'] = $item['selected'];
				$view = isset($item['renderAction']['view']) ? $item['renderAction']['view'] : '';
				$item['actionContent'] = $this->action($action, $params, $view);
			}
			/**
			 * Рендерим подменю, если есть конфигурация подменю и:
			 * - Выводятся все уровни меню или
			 * - Выводятся только подменю выделенных пунктов или
			 * - Выводятся только подменю отмеченные флагом isOpened
			 */
			elseif (isset($item['submenu']) && (!$openJustSelected || $item['selected'] || $item['submenu']['isOpened'])) {
				$view = isset($item['submenu']['view']) ? $item['submenu']['view'] : '';
				$params = [
					'basePath' => $itemPath . ".submenu",
					'activePaths' => $this->request->activePaths,
					'openJustSelected' => $openJustSelected,
				];
				$item['nestedMenu'] = $this->action('menu.render', $params, $view);
			}

			$items[] = $item;
		}

		$this->response->htmlOptions = \MenuItemsConfig::get($basePath . 'htmlOptions');
		$this->response->defaultContainerOptions = \MenuItemsConfig::get($basePath . 'containerOptions');
		$this->response->defaultLinkOptions = \MenuItemsConfig::get($basePath . 'linkOptions');
		$this->response->items = $items;
	}

	protected function calculateActivePaths($paths)
	{
		$paths = (array)$paths;
		foreach ($paths as &$path) {
			$path = 'items.' . str_replace('.', '.submenu.items.', $path);
		}

		return $paths;
	}
}